package com.anti.jdbc;

import com.anti.jdbc.support.SpSupportBean;
import com.anti.jdbc.support.page.PageParam;
import com.anti.jdbc.support.page.PageResult;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

/**
 * @Description jdbc操作工具类
 * @Author anTi
 * @Date 2021-3-12
 */
public class DBUtils {

    private  BaseJdbcTemplate baseJdbcTemplate;

    public DBUtils(DataSource  dataSource) {
        this.baseJdbcTemplate = new BaseJdbcTemplate(dataSource);
    }
    public DBUtils(DataSource  dataSource, boolean lazyInit) {
        this.baseJdbcTemplate = new BaseJdbcTemplate(dataSource,lazyInit);
    }

    //针对sql

    /**
     *
     * @param sql
     * @param cls
     * @param params
     * @param <R>
     * @return JavaBean对象。
     */
    public  <R> R queryForObject(String sql, Class<R> cls, Object... params){
        return this.baseJdbcTemplate.queryForObject(sql, cls, params);
    }

    /**
     * 返回查询只有单一对象的结果，这个单一结果应该是简单的数据类型，
     * 如：Integer.class、Long.class、String.class等类型，
     * 可以用于聚合函数的查询结果。
     * @param sql
     * @param cls
     * @param params
     * @param <R>
     * @return 单一对象结果的列
     */
    public <R> Object getValue(String sql, Class<R> cls, Object... params){
        return this.queryForObject(sql, cls, params);
    }

    public int getIntValue(String sql,Object... params){
        return this.queryForObject(sql, Integer.class, params);
    }

    public long getLongValue(String sql,Object... params){
        return this.queryForObject(sql, Long.class, params);
    }

    public String getStringValue(String sql,Object... params){
        return this.queryForObject(sql, String.class, params);
    }

    /**
     * 查询单一实体对象
     * @param sql
     * @param cls
     * @param params
     * @param <R>
     * @return 返回实体对象
     */
    public <R> R get(String sql, Class<R> cls, Object... params){
        return this.baseJdbcTemplate.queryForObject(sql, cls, params);
    }

    public Map<String, Object> get(String sql, Object... params){
        return this.baseJdbcTemplate.get(sql, params);
    }

    public <R> R getFirst(String sql, Class<R> cls, Object... params){
        return this.baseJdbcTemplate.getFirst(sql, cls, params);
    }

    public Map<String, Object> getFirst(String sql, Object... params){
        return this.baseJdbcTemplate.getFirst(sql,params);
    }

    public <R> List<R> query(String sql, Class<R> cls, Object... params){
        return this.baseJdbcTemplate.query(sql, cls, params);
    }

    public List<Map<String, Object>> query(String sql, Object... params){
        return this.baseJdbcTemplate.query(sql, params);
    }

    public PageResult query(PageParam pageParam, String sql, Object... params){
        return this.baseJdbcTemplate.query(pageParam, sql, params);
    }

    public <R> PageResult query(PageParam pageParam, String sql, Class<R> cls, Object... params){
        return this.baseJdbcTemplate.query(pageParam, sql, cls, params);
    }

    public int save(String sql, Object... params){
        return this.execSql(sql, params);
    }

    public int delete(String sql, Object... params){
        return this.execSql(sql, params);
    }

    public int update(String sql, Object... params){
        return this.execSql(sql, params);
    }

    /**
     * 用于执行新增修改删除语句。
     * @param sql
     * @param params
     * @return
     */
    public int execSql(String sql, Object... params){
        return this.baseJdbcTemplate.execSql(sql, params);
    }

    /**
     * 执行存储过程
     * @param spSupportBean
     */
    public void executeProcedure(SpSupportBean spSupportBean){
        this.baseJdbcTemplate.executeProcedure(spSupportBean);
    }

    /**
     * 执行数据库函数
     * @param fun 函数名称
     * @param cls 返回类型
     * @param params 参数
     * @param <R>
     * @return
     */
    public <R> R executeFunction(String fun, Class<R> cls, Object... params){
        return this.baseJdbcTemplate.executeFunction(fun, cls, params);
    }

    //针对实体
    public int insert(Object persistent){
        return this.baseJdbcTemplate.insert(persistent);
    }

    public int insertWithNull(Object persistent){
        return this.baseJdbcTemplate.insertWithNull(persistent);
    }

    /**
     * 保存并返回主键
     * @param persistent
     * @return
     */
    public Object insertKey(Object persistent){
        return this.baseJdbcTemplate.insertKey(persistent);
    }

    public int batchInsert(List<?> persistents){
        return this.baseJdbcTemplate.batchInsert(persistents);
    }

    public int update(Object persistent) {
        return baseJdbcTemplate.update(persistent);
    }


    public DataSource getDataSource(){
        return  this.baseJdbcTemplate.getDataSource();
    }

    public JdbcTemplate getJdbcTemplate(){
        return this.baseJdbcTemplate.getJdbcTemplate();
    }
}
